from django.contrib.auth.models import AbstractUser
from django.db import models
from itsdangerous import TimedJSONWebSignatureSerializer as TJWSSerializer
from django.conf import settings
from utils.models import BaseModel

"""
用户模型类可以直接复用django中的用户
1, 可以拥有django自带的用户名,邮箱,密码...字段
2, 可以继承然后添加我们自己的想要的字段
"""
class User(AbstractUser):

    mobile = models.CharField(verbose_name="手机号",max_length=11,unique=True)
    email_active = models.BooleanField(verbose_name="邮箱激活状态",default=False)
    default_address = models.ForeignKey('Address', related_name='users', null=True, blank=True, on_delete=models.SET_NULL, verbose_name='默认地址')

    class Meta:
        db_table = "tb_users"
        verbose_name = "用户"
        verbose_name_plural = verbose_name

    #生成验证的邮箱链接
    def generate_verify_url(self):
        #1,创建序列化器对象
        serializer = TJWSSerializer(settings.SECRET_KEY,expires_in=300)

        #2,加密数据(user_id,email)
        token = serializer.dumps({"user_id":self.id,"email":self.email})

        #3,生成链接返回
        verify_url = 'http://www.meiduo.site:8080/success_verify_email.html?token=%s'%token.decode()
        return verify_url

    @classmethod
    def check_verify_url_token(cls,token):
        #1,创建序列化器对象
        serializer = TJWSSerializer(settings.SECRET_KEY,expires_in=300)

        #2,解密token
        dict_data = serializer.loads(token)

        #3,获取用户,返回用户
        user_id = dict_data.get("user_id")
        try:
            user = User.objects.get(id=user_id)
        except Exception:
            user = None

        return user


class Address(BaseModel):
    """
    用户地址
    """
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='addresses', verbose_name='用户')
    title = models.CharField(max_length=20, verbose_name='地址名称')
    receiver = models.CharField(max_length=20, verbose_name='收货人')
    province = models.ForeignKey('areas.Area', on_delete=models.PROTECT, related_name='province_addresses', verbose_name='省')
    city = models.ForeignKey('areas.Area', on_delete=models.PROTECT, related_name='city_addresses', verbose_name='市')
    district = models.ForeignKey('areas.Area', on_delete=models.PROTECT, related_name='district_addresses', verbose_name='区')
    place = models.CharField(max_length=50, verbose_name='地址')
    mobile = models.CharField(max_length=11, verbose_name='手机')
    tel = models.CharField(max_length=20, null=True, blank=True, default='', verbose_name='固定电话')
    email = models.CharField(max_length=30, null=True, blank=True, default='', verbose_name='电子邮箱')
    is_deleted = models.BooleanField(default=False, verbose_name='逻辑删除')

    class Meta:
        db_table = 'tb_address'
        verbose_name = '用户地址'
        verbose_name_plural = verbose_name
        ordering = ['-update_time'] #获取的时候按照更新时间,倒序排列